struct _Node {
NodeType type;
- const gchar *name;
+ gchar *name;
GQuark action_name;
GtkAction *action;
const gchar *path,
NodeType node_type,
gboolean create);
+static gboolean free_node (GNode *node);
static void node_prepend_ui_reference (Node *node,
guint merge_id,
self->private_data->last_merge_id = 0;
self->private_data->add_tearoffs = FALSE;
-
merge_id = gtk_ui_manager_new_merge_id (self);
- node = get_child_node (self, NULL, "ui", 4,
- NODE_TYPE_ROOT, TRUE, FALSE);
+ node = get_child_node (self, NULL, "ui", 2,
+ NODE_TYPE_ROOT, TRUE, FALSE);
node_prepend_ui_reference (NODE_INFO (node), merge_id, 0);
}
g_source_remove (self->private_data->update_tag);
self->private_data->update_tag = 0;
}
+
+ g_node_traverse (self->private_data->root_node,
+ G_POST_ORDER, G_TRAVERSE_ALL, -1,
+ (GNodeTraverseFunc)free_node, 0);
+ g_node_destroy (self->private_data->root_node);
+ self->private_data->root_node = NULL;
+
+ g_list_foreach (self->private_data->action_groups,
+ (GFunc) g_object_unref, NULL);
+ g_list_free (self->private_data->action_groups);
+ self->private_data->action_groups = NULL;
+
+ g_object_unref (self->private_data->accel_group);
+ self->private_data->accel_group = NULL;
}
static void
* Since: 2.4
**/
GList *
-gtk_ui_manager_get_action_groups (GtkUIManager *self)
+gtk_ui_manager_get_action_groups (GtkUIManager *self)
{
g_return_val_if_fail (GTK_IS_UI_MANAGER (self), NULL);
* Since: 2.4
**/
GtkAccelGroup *
-gtk_ui_manager_get_accel_group (GtkUIManager *self)
+gtk_ui_manager_get_accel_group (GtkUIManager *self)
{
g_return_val_if_fail (GTK_IS_UI_MANAGER (self), NULL);
* Since: 2.4
**/
GtkAction *
-gtk_ui_manager_get_action (GtkUIManager *self,
- const gchar *path)
+gtk_ui_manager_get_action (GtkUIManager *self,
+ const gchar *path)
{
GNode *node;
}
static GNode *
-get_child_node (GtkUIManager *self,
- GNode *parent,
- const gchar *childname,
- gint childname_length,
- NodeType node_type,
- gboolean create,
- gboolean top)
+get_child_node (GtkUIManager *self,
+ GNode *parent,
+ const gchar *childname,
+ gint childname_length,
+ NodeType node_type,
+ gboolean create,
+ gboolean top)
{
GNode *child = NULL;
}
static GNode *
-get_node (GtkUIManager *self,
- const gchar *path,
- NodeType node_type,
- gboolean create)
+get_node (GtkUIManager *self,
+ const gchar *path,
+ NodeType node_type,
+ gboolean create)
{
const gchar *pos, *end;
GNode *parent, *node;
if (node != NULL && NODE_INFO (node)->type == NODE_TYPE_UNDECIDED)
NODE_INFO (node)->type = node_type;
+
return node;
}
+static gboolean
+free_node (GNode *node)
+{
+ Node *info = NODE_INFO (node);
+
+ g_list_foreach (info->uifiles, (GFunc) g_free, NULL);
+ g_list_free (info->uifiles);
+
+ if (info->action)
+ g_object_unref (info->action);
+ g_free (info->name);
+ g_chunk_free (info, merge_node_chunk);
+
+ return FALSE;
+}
+
/**
* gtk_ui_manager_new_merge_id:
* @self: a #GtkUIManager
}
static void
-node_prepend_ui_reference (Node *node,
- guint merge_id,
- GQuark action_quark)
+node_prepend_ui_reference (Node *node,
+ guint merge_id,
+ GQuark action_quark)
{
NodeUIReference *reference;
}
static void
-node_remove_ui_reference (Node *node,
- guint merge_id)
+node_remove_ui_reference (Node *node,
+ guint merge_id)
{
GList *p;
{
if (info->proxy)
gtk_widget_destroy (info->proxy);
- if ((info->type == NODE_TYPE_MENU_PLACEHOLDER ||
- info->type == NODE_TYPE_TOOLBAR_PLACEHOLDER) &&
- info->extra)
+ if (info->extra)
gtk_widget_destroy (info->extra);
- g_chunk_free (info, merge_node_chunk);
+ free_node (node);
g_node_destroy (node);
}
}
*
* Since: 2.4
**/
-gchar*
-gtk_ui_manager_get_ui (GtkUIManager *self)
+gchar *
+gtk_ui_manager_get_ui (GtkUIManager *self)
{
GString *buffer;
return menu;
}
+static GtkWidget*
+create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
+{
+ GtkWidget *menu;
+ GtkWidget *menuitem;
+ GtkWidget *submenu;
+ GtkWidget *image;
+ char buf[32];
+ int i, j;
+
+ menu = gtk_menu_new ();
+ gtk_menu_set_screen (GTK_MENU (menu), screen);
+
+ j = 0;
+ if (tearoff)
+ {
+ menuitem = gtk_tearoff_menu_item_new ();
+ gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
+ gtk_widget_show (menuitem);
+ j++;
+ }
+
+ menuitem = gtk_menu_item_new_with_label ("items");
+ gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
+
+ submenu = gtk_menu_new ();
+ gtk_menu_set_screen (GTK_MENU (submenu), screen);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
+ gtk_widget_show (menuitem);
+ j++;
+
+ /* now fill the items submenu */
+ image = gtk_image_new_from_stock (GTK_STOCK_HELP,
+ GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image);
+ menuitem = gtk_image_menu_item_new_with_label ("Image");
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("x");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("x");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
+ gtk_widget_show (menuitem);
+
+ image = gtk_image_new_from_stock (GTK_STOCK_HELP,
+ GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image);
+ menuitem = gtk_image_menu_item_new_with_label ("Image");
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("x");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("x");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_check_menu_item_new_with_label ("Check");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("x");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("x");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_check_menu_item_new_with_label ("Check");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
+ gtk_widget_show (menuitem);
+ /* end of items submenu */
+
+ menuitem = gtk_menu_item_new_with_label ("spanning");
+ gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
+
+ submenu = gtk_menu_new ();
+ gtk_menu_set_screen (GTK_MENU (submenu), screen);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
+ gtk_widget_show (menuitem);
+ j++;
+
+ /* now fill the spanning submenu */
+ menuitem = gtk_menu_item_new_with_label ("a");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("b");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("c");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("d");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("e");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
+ gtk_widget_show (menuitem);
+ /* end of spanning submenu */
+
+ menuitem = gtk_menu_item_new_with_label ("left");
+ gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
+ submenu = gtk_menu_new ();
+ gtk_menu_set_screen (GTK_MENU (submenu), screen);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("Empty");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("right");
+ gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
+ submenu = gtk_menu_new ();
+ gtk_menu_set_screen (GTK_MENU (submenu), screen);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
+ gtk_widget_show (menuitem);
+
+ menuitem = gtk_menu_item_new_with_label ("Empty");
+ gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
+ gtk_widget_show (menuitem);
+
+ j++;
+
+ for (; j < rows; j++)
+ for (i = 0; i < cols; i++)
+ {
+ sprintf (buf, "(%d %d)", i, j);
+ menuitem = gtk_menu_item_new_with_label (buf);
+ gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
+ gtk_widget_show (menuitem);
+ }
+
+ return menu;
+}
+
static void
create_menus (GtkWidget *widget)
{
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
gtk_widget_show (menuitem);
+
+ menu = create_table_menu (screen, 2, 50, TRUE);
+
+ menuitem = gtk_menu_item_new_with_label ("table");
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
+ gtk_widget_show (menuitem);
menuitem = gtk_menu_item_new_with_label ("foo");
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));